from rest_framework import serializers
# 序列化器
from drfstudy.models import Student, Classes


# 需要过滤的字段 可以再弄个序列化来实现
class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student
        # fields = '__all__' # 展示全部字段
        # 过滤掉 不展示的字段
        exclude = ['is_delete', 'created_time', 'updated_time', 'classes']  # 不展示字段 无法对该字段操作


# 序列化器 决定前端展示什么字段
class StudentSerializer(serializers.ModelSerializer):
    # 新增属性值外键字段 自定义名称
    # 班级名称来自班级模型 Student.classes.name
    # 序列化后能看到 响应到前端 read_only=True 只读字段 班级表里的字段拿到学生表
    classes_name = serializers.CharField(source='classes.name', read_only=True)

    # 针对于已有模型类时 才可以继承ModelSerializer
    # 指定模型类 为
    class Meta:
        model = Student
        # fields = '__all__' # 展示全部字段
        exclude = ['is_delete']  # 不展示字段 无法对该字段操作
        # # 简单校验
        extra_kwargs = {
            # 'age': {"min_value": 16, "max_value": 100},
            # 能写 但是序列化后不显示
            'classes': {'write_only': True}
        }

    # 校验字段
    # 学生的名字里面带上 one drf
    # 单个字段校验
    # def validate_name(self, value):
    #     if 'drf' not in value:
    #         raise serializers.ValidationError('用户名必须带有drf')
    #     return value

    # 多个字段校验
    # 对象级别的校验
    # attrs 客户端传递的所有数据 {"key":"value", "name":"ddd"}
    def validate(self, attrs):
        if 'drf' not in attrs.get('name').lower():
            raise serializers.ValidationError('用户名必须带有drf')
        if attrs.get('age') < 18:
            raise serializers.ValidationError('年龄不能小于18岁')
        return attrs

    # id = serializers.IntegerField(read_only=True, label='ID')
    # name = serializers.CharField(required=False, max_length=20, label='姓名')
    # # required=False 校验的时候允许为空
    # age = serializers.IntegerField(required=False, label='年龄')
    # sex = serializers.IntegerField(required=False, label='性别')
    # created_time = serializers.DateTimeField(required=False, label='创建时间')
    # updated_time = serializers.DateTimeField(required=False, label='更新时间')
    # is_delete = serializers.BooleanField(required=False, label='逻辑删除')

    # # 父类里create没有保存功能 重写create方法 就优先执行StudentSerializer类create方法
    # def create(self, validated_data):
    #     # validated_data 是校验后的数据 前端通过StudentSerializer转python格式的数据
    #     # {'a':'b'} # 函数拆包 **
    #     return Student.objects.create(**validated_data)
    #
    # def update(self, instance, validated_data):
    #     # instance 是当前对象 validated_data 是校验后的数据
    #     # 有数据才更新 无就是原本
    #     instance.name = validated_data.get('name', instance.name)
    #     instance.age = validated_data.get('age', instance.age)
    #     instance.sex = validated_data.get('sex', instance.sex)
    #     instance.save()
    #     return instance


class ClassesSerializer(serializers.ModelSerializer):
    # 序列化器 套用其他序列化器
    # 班级表展示学生信息 1 n
    # 展示所有学生信息
    # classes.student_set 反向关联关系
    student_set = StudentSerializerSimple(many=True, read_only=True)

    class Meta:
        # 指定序列化的模型类
        model = Classes
        # fields = '__all__'
        # 指定前端不展示的字段
        exclude = ['is_delete']
